package com.cskaoyan.javase.exception._1handle._1catch;

/**
 * @description: 捕获异常并处理异常
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 程序中抛出异常对象后,该对象是可以被捕获的,这样该异常对象就不再会被抛给JVM了,JVM就不会做默认处理了
 * 异常捕获处理的语法:
 * 单分支的try..catch
 *      try {
 *          //可能出现异常的，正常的代码逻辑
 *      } catch(要捕捉的异常对象) {
 *          //每一个catch分支对应一个异常处理器
 *          //在catch分支中处理具体类型的代码异常
 *      }
 * 解释:
 *      1.catch代码块称之为异常处理器,它可以捕获try代码块中产生的异常,并且处理它
 *      2.catch()语法中的()应该填入异常的类型和异常对象的名字(方便在方法体中使用该对象)
 *          语法是: 异常类型的名字 异常对象名
 *      3.当catch异常处理器恰好能够捕获到try代码块中的异常,该异常对象就不会再抛给jvm了,执行完catch代码块中的代码后
 *          程序仍然正常继续运行
 *      4.当catch捕获异常对象失败时,相当于没有做异常处理,该异常对象仍然做默认处理,抛给jvm,程序终止,在控制台打印信息
 *      5.try中如果没有异常抛出,catch代码块不会被执行,代码仍然继续正常运行
 *      6.try代码块要么不产生异常,要么至多产生一个异常,因为一旦某行产生异常,后面的代码都不会执行了
 *      7.在java8当中,单分支的try...catch也是可以同时处理多个异常类型的:
 *          catch(异常类型名1 | 异常类型名2 | ... 异常对象名){
 *          }
 *          由于try代码块中最多只会产生一个异常,所以即便匹配多个异常类型,也只需一个对象名即可
 *          这种语法相当于对多种类型的异常对象,做了同样的处理操作
 *      8.假如真的不知道程序会产生什么异常,或者单纯偷懒,可以在catch中直接捕获父类异常
 *          当然这种做法不好,尽量明确捕获的异常类型
 *      9.try..catch结构会增加代码层级,让代码变得可读性不好,所以把尽量少的代码放入try当中
 *          最好就是会产生异常的那个方法才放进try当中
 *
 *      10.try...catch也可以用于捕获和处理编译时异常,实际上它就是编译时异常处理的一种方式
 *          特别需要注意的是,如果catch一个编译时异常,只有在try中会抛出该异常时才能够这么做
 *          而运行时异常可以任意捕获
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*int[] arr = new int[3];
        arr = null;
        System.out.println("before");
        try {
            System.out.println(10 / 0);
            System.out.println(arr.length);
        } catch (Exception e) {
            //做异常处理
            System.out.println("程序发生了异常");
        }

        System.out.println("after");*/

        Demo d = new Demo();
        try {
            d.clone();
        }catch (CloneNotSupportedException e){
            System.out.println("产生了克隆异常");
        }
        System.out.println("after");

    }
}
